package com.cn.wanxi.util;


import com.cn.wanxi.model.UserModel;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
 *  1.引入jar包
 *  2.创建一个资源文件resources
 *  3.创建配置文件config.xml
 *      1）jdbc连接数据库的url，driver，usernmae，password
 *      2）需要将sql语句打印到控制台（用于我们开发）
 *      3）datasource配置：读取jdbc里面的内容
 *      4）mapper映射
 *      <mappers>
 *         <mapper resource="/mapper/companyMapper.xml"/>
 *         <mapper resource="/mapper/userMapper.xml"/>
 *     </mappers>
 *  4.创建jdbc.properties
 *  5.创建得到SqlSession的Java文件GetSqlSession.java
 *  6.修改数据实现层Impl层
 *  GetSqlSession.getSqlSession().insert("com.cn.wanxi.dao.IUserDao.add", userModel);
 *  第一个参数：接口里面的方法名称全路径
 *  第二个参数：传递的对象(有且只能传一个值)
 *  7.修改userMapper.xml
 *
 */
public class GetSqlSession {
    /**
     * mybatis默认开启sqlsession缓存。
     * 每一个用户一个sqlsession，即使是共有的信息也会存到自己的缓存中，
     * 其他的用户查，即使是同样的方法，同一份数据，也会重新查数据库，因为sqlsession对象不一样
     * 能走缓存的前提是，这些sqlsession对象都是同factory创建的
     * 不同线程，不同的sqlsession，并且每个线程只能有一个sqlsession
     * threadLocal 封装sqlsession对象
     * threadLocal存储的数据，只能是线程内有效
     */
    private static SqlSession sqlSession = null;

    /**
     * 开启缓存
     *
     * @return
     */
    public static SqlSession getSqlSession() {

        String resource = "config.xml";
        SqlSessionFactory sqlSessionFactory = null;//开启工厂，一个工厂可以放多个SqlSession
        try {
// 打开资源文件
            InputStream inputStream = Resources.getResourceAsStream(resource);
// 开启sqlsession
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            if (sqlSession == null) {
                sqlSession = sqlSessionFactory.openSession(true);//所有的的sqlsession对象都是factory.openSession（）得到的
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return sqlSession;
    }

    /**
     * 事物提交
     * 注意，sqlsession查询公有数据的对象，只有在commit或者close的时候，才会把缓存刷新到factory中
     * 其他用户查数据的时候，先在自己的sqlsession中找，没有再去factory中找。
     * 都没有再查数据库，然后先自己缓存一份，提交或者关闭的时候，再刷新到factory中
     */
    public static void commit() {
        if (sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
            sqlSession = null;
        }
    }

    public static void rollback() {
        if (sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
            sqlSession = null;
        }
    }
    /**
     * 1.下载druid包
     * 2.修改config.xml
     *  <typeAliases>
     *         <typeAlias type="druid" alias="com.cn.wanxi.util.DruidDataSourceFactory"></typeAlias>
     *     </typeAliases>
     *
     *   <dataSource type="druid">
     * 3.重写datasource
     * DruidDataSourceFactory
     * 4. 修改读取配置
     *  String resource = "druid.xml";
     */
}